package UI.funcionarios;

import UI.PanelFormularioGenerico;
import gestorBD.Controlador;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import uiMain.OpcionDeMenu;
import static uiMain.bienRaizOk.ventana;

public class PanelOpcionRegistrarInmueble extends OpcionDeMenu {

    JPanel panelTipoDeInmueble;//Norte
    JComboBox comboBoxTipoDeInmueble;

    //JScrollPane scrollCentral;//Centro
    JPanel panelCentral;//Centro
    PanelFormularioGenerico panelFormularioInmueble;
    JComboBox comboBoxRol;
    PanelFormularioGenerico panelFormularioRol;

    JPanel panelDeBotones;//Sur
    String[] roles = {"Venta", "Alquiler", "Venta y alquiler"};

    String[] labelsCasa = {"Cédula del propietario    ", "Código de la casa", "Código de la unidad", "Número de pisos", "Área total (m2)", "Número de baños", "Número de alcobas", "Número de garajes"};
    String[] valoresCasa = {"", Controlador.obtenerSiguienteCodigoDeCasa(), "", "", "", "", "", ""};

    String[] labelsApartamento = {"Cédula del propietario", "Código del apartamento", "Código de la unidad", "Número de torre", "Número de pisos de la torre", "Número de apartamentos por piso    ", "Número de ascensores", "Área total (m2)", "Número de baños", "Número de alcobas", "Número de parqueaderos"};
    String[] valoresApartamento = {"", Controlador.obtenerSiguienteCodigoDeApartamento(), "", "", "", "", "", "", "", "", ""};

    String[] labelsRol = {"Precio de venta", "Tarifa de arrendamiento"};
    String[] valoresRol = {"", ""};
    int[] tiposDeCampoRol;

    @Override
    public void ejecutar() {
        this.setLayout(new BorderLayout());

        //Se crea la zona norte, en la cual está el label y el combobox para seleccionar casa o apartamento
        JLabel labelSeleccioneTipoDeInmueble = new JLabel("Seleccione el tipo de inmueble");
        String[] tiposDeInmueble = {"Apartamento", "Casa"};
        comboBoxTipoDeInmueble = new JComboBox(tiposDeInmueble);
        this.panelTipoDeInmueble = new JPanel(new FlowLayout());
        this.panelTipoDeInmueble.add(labelSeleccioneTipoDeInmueble);
        this.panelTipoDeInmueble.add(comboBoxTipoDeInmueble);
        this.add(panelTipoDeInmueble, BorderLayout.NORTH);

        //Se crea la zona central, para el formulario del inmueble, y el formulario del rol con su combobox
        this.panelCentral = new JPanel();
        this.panelCentral.setLayout(new BoxLayout(panelCentral, BoxLayout.Y_AXIS));
        this.add(this.panelCentral, BorderLayout.CENTER);

        this.panelFormularioInmueble = new PanelFormularioGenerico();
        this.comboBoxRol = new JComboBox(roles);
        this.panelFormularioRol = new PanelFormularioGenerico();

        //Se crea la zona sur, para los botones registrar y volver
        this.panelDeBotones = new JPanel(new FlowLayout());
        JButton botonRegistrar = new JButton("Registrar inmueble");
        this.panelDeBotones.add(botonRegistrar);
        JButton botonVolver = new JButton("Volver");
        this.panelDeBotones.add(botonVolver);

        //Se añaden las funcionalidades
        comboBoxTipoDeInmueble.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                switch (comboBoxTipoDeInmueble.getSelectedIndex()) {
                    case 0://Apartamento

                        //Se resetean los campos del formulario del apartamento
                        String[] valoresVaciosApartamento = {"", Controlador.obtenerSiguienteCodigoDeApartamento(), "", "", "", "", "", "", "", "", ""};
                        valoresApartamento = valoresVaciosApartamento;
                        int[] tiposDeCampoApartamento = {1, 5, 0, 2, 2, 2, 2, 3, 2, 2, 2};
                        setPanelCentral(new PanelFormularioGenerico("Criterio", "Valor", labelsApartamento, valoresApartamento, tiposDeCampoApartamento));

                        //Se reinicia el panel del rol del inmueble y su combobox
                        reiniciarPanelRol(new JComboBox(roles), new PanelFormularioGenerico());

                        //Se le agrega el listener al nuevo comboBoxRol
                        comboBoxRol.addActionListener(new ActionListener() {

                            @Override
                            public void actionPerformed(ActionEvent ae) {

                                switch (comboBoxRol.getSelectedIndex()) {
                                    case 0://Venta
                                        String[] valoresVaciosRol = {"", ""};
                                        valoresRol = valoresVaciosRol;
                                        int[] auxTipo = {1, 5};
                                        tiposDeCampoRol = auxTipo;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));

                                        break;
                                    case 1://Alquiler
                                        String[] valoresVaciosRol1 = {"", ""};
                                        valoresRol = valoresVaciosRol1;
                                        int[] auxTipo1 = {5, 1};
                                        tiposDeCampoRol = auxTipo1;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));
                                        break;
                                    case 2://Venta y alquiler
                                        String[] valoresVaciosRol2 = {"", ""};
                                        valoresRol = valoresVaciosRol2;
                                        int[] auxTipo2 = {1, 1};
                                        tiposDeCampoRol = auxTipo2;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));
                                        break;
                                }
                            }
                        });
                        break;
                    case 1: //Casa
                        //Se resetean los campos del formulario de la casa
                        String[] valoresVaciosCasa = {"", Controlador.obtenerSiguienteCodigoDeCasa(), "", "", "", "", "", ""};
                        valoresCasa = valoresVaciosCasa;
                        int[] tiposDeCampoCasa = {1, 5, 0, 2, 3, 2, 2, 2};
                        setPanelCentral(new PanelFormularioGenerico("Criterio", "Valor", labelsCasa, valoresCasa, tiposDeCampoCasa));

                        //Se reinicia el panel del rol del inmueble y su combobox
                        reiniciarPanelRol(new JComboBox(roles), new PanelFormularioGenerico());

                        //Se le agrega el listener al nuevo comboBoxRol
                        comboBoxRol.addActionListener(new ActionListener() {

                            @Override
                            public void actionPerformed(ActionEvent ae) {

                                switch (comboBoxRol.getSelectedIndex()) {
                                    case 0://Venta
                                        String[] valoresVaciosRol = {"", ""};
                                        valoresRol = valoresVaciosRol;
                                        int[] auxTipo = {1, 5};
                                        tiposDeCampoRol = auxTipo;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));

                                        break;
                                    case 1://Alquiler
                                        String[] valoresVaciosRol1 = {"", ""};
                                        valoresRol = valoresVaciosRol1;
                                        int[] auxTipo1 = {5, 1};
                                        tiposDeCampoRol = auxTipo1;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));
                                        break;
                                    case 2://Venta y alquiler
                                        String[] valoresVaciosRol2 = {"", ""};
                                        valoresRol = valoresVaciosRol2;
                                        int[] auxTipo2 = {1, 1};
                                        tiposDeCampoRol = auxTipo2;
                                        setPanelFormularioRol(new PanelFormularioGenerico("", "", labelsRol, valoresRol, tiposDeCampoRol));
                                        break;
                                }
                            }
                        });
                        break;

                }
            }
        });

        botonRegistrar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                if (comboBoxTipoDeInmueble.getSelectedIndex() == 0) { //Si se va a registrar un apartamento
                    for (int i = 0; i < labelsApartamento.length; i++) {
                        if (valoresApartamento[i].equals("")) {
                            String textoPopUp = "El campo " + labelsApartamento[i].toLowerCase() + " es obligatorio";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                    }

                    for (int i = 0; i < labelsRol.length; i++) {
                        if (tiposDeCampoRol != null) {
                            if (valoresRol[i].equals("") && tiposDeCampoRol[i] == 1) {
                                String textoPopUp = "El campo " + labelsRol[i].toLowerCase() + " es obligatorio";
                                JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                                return;
                            }
                        } else {
                            String textoPopUp = "Seleccione un rol para este apartamento";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }

                        if (valoresRol[i].equals("") && tiposDeCampoRol[i] == 5) {
                            valoresRol[i] = "0";
                        }
                    }
                    
                    long cedula = Long.parseLong(valoresApartamento[0]);
                    String codigoApto = valoresApartamento[1];
                    String codigoUnidad = valoresApartamento[2].toUpperCase();
                    int numeroTorre = Integer.parseInt(valoresApartamento[3]);
                    int numeroPisosTorre = Integer.parseInt(valoresApartamento[4]);
                    int numeroAptosXPiso = Integer.parseInt(valoresApartamento[5]);
                    int numeroAscensores = Integer.parseInt(valoresApartamento[6]);
                    float area = Float.parseFloat(valoresApartamento[7]);
                    int numeroBanhos = Integer.parseInt(valoresApartamento[8]);
                    int numeroAlcobas = Integer.parseInt(valoresApartamento[9]);
                    int numeroParqueaderos = Integer.parseInt(valoresApartamento[10]);
                    byte rol = (byte) (comboBoxRol.getSelectedIndex() + 1);
                    long precioDeVenta = Long.parseLong(valoresRol[0]);
                    long tarifaDeArrendamiento = Long.parseLong(valoresRol[1]);

                    String textoPopUp = Controlador.registrarNuevoApartamento(cedula, codigoApto, codigoUnidad, numeroTorre, numeroPisosTorre, numeroAptosXPiso, numeroAscensores, area, numeroBanhos, numeroAlcobas, numeroParqueaderos, rol, precioDeVenta, tarifaDeArrendamiento);
                    JOptionPane.showMessageDialog(null, textoPopUp, "Información", JOptionPane.INFORMATION_MESSAGE);
                    if (textoPopUp.contains("correctamente")) {
                        ventana.mostrarPanelOpcionesDeFuncionario();
                    }

                } else { //Si se va a registrar una casa
                    for (int i = 0; i < labelsCasa.length; i++) {
                        if (valoresCasa[i].equals("")) {
                            String textoPopUp = "El campo " + labelsCasa[i].toLowerCase() + " es obligatorio";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                    }

                    for (int i = 0; i < labelsRol.length; i++) {
                        if (tiposDeCampoRol != null) {
                            if (valoresRol[i].equals("") && tiposDeCampoRol[i] == 1) {
                                String textoPopUp = "El campo " + labelsRol[i].toLowerCase() + " es obligatorio";
                                JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                                return;
                            }
                        } else {
                            String textoPopUp = "Seleccione un rol para esta casa";
                            JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                            return;
                        }

                        if (valoresRol[i].equals("") && tiposDeCampoRol[i] == 5) {
                            valoresRol[i] = "0";
                        }
                    }

                    
                    long cedula = Long.parseLong(valoresCasa[0]);
                    String codigoCasa = valoresCasa[1];
                    String codigoUnidad = valoresCasa[2].toUpperCase();
                    int numeroPisos = Integer.parseInt(valoresCasa[3]);
                    float area = Float.parseFloat(valoresCasa[4]);
                    int numeroBanhos = Integer.parseInt(valoresCasa[5]);
                    int numeroAlcobas = Integer.parseInt(valoresCasa[6]);
                    int numeroGarajes = Integer.parseInt(valoresCasa[7]);
                    byte rol = (byte) (comboBoxRol.getSelectedIndex() + 1);
                    long precioDeVenta = Long.parseLong(valoresRol[0]);
                    long tarifaDeArrendamiento = Long.parseLong(valoresRol[1]);

                    String textoPopUp = Controlador.registrarNuevaCasa(cedula, codigoCasa, codigoUnidad, numeroPisos, area, numeroBanhos, numeroAlcobas, numeroGarajes, rol, precioDeVenta, tarifaDeArrendamiento);
                    JOptionPane.showMessageDialog(null, textoPopUp, "Información", JOptionPane.INFORMATION_MESSAGE);
                    if (textoPopUp.contains("correctamente")) {
                        ventana.mostrarPanelOpcionesDeFuncionario();
                    }
                }

            }

        });

        botonVolver.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ventana.mostrarPanelOpcionesDeFuncionario();
            }

        });

        ventana.mostrarPanel(this);
    }

    private void setPanelCentral(PanelFormularioGenerico nuevoPanelFormulario) {

        this.panelCentral.remove(panelFormularioInmueble);
        this.panelCentral.remove(comboBoxRol);
        this.panelCentral.remove(panelFormularioRol);
        this.panelFormularioInmueble = nuevoPanelFormulario;
        this.panelCentral.add(panelFormularioInmueble);
        this.add(this.panelDeBotones, BorderLayout.SOUTH);
        this.revalidate();
        this.repaint();
    }

    private void setPanelFormularioRol(PanelFormularioGenerico nuevoPanelRol) {
        this.panelCentral.remove(this.panelFormularioRol);
        this.panelCentral.add(nuevoPanelRol);
        this.panelFormularioRol = nuevoPanelRol;
        this.revalidate();
        this.repaint();
    }

    private void reiniciarPanelRol(JComboBox nuevoJComboBox, PanelFormularioGenerico nuevoPanelRol) {
        this.panelCentral.remove(this.comboBoxRol);
        this.panelCentral.remove(this.panelFormularioRol);
        this.comboBoxRol = nuevoJComboBox;
        this.panelFormularioRol = nuevoPanelRol;
        this.panelCentral.add(this.comboBoxRol);
        this.panelCentral.add(this.panelFormularioRol);
        this.revalidate();
        this.repaint();
    }

    @Override
    public String toString() {
        return "Registrar un inmueble";
    }

}
